package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 通过提高每次读写的数据量,减少实际读写的次数可以提高读写效率
 *
 * 一次读/写一组数据的过程称为:块读/块写
 */
public class CopDemno2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("./one.jpg");
        FileOutputStream fos=new FileOutputStream("./one_.jpg");

        int d=1;//记录每次实际读取的数据量
        byte[] date=new byte[1024*10];//10kb
        long start=System.currentTimeMillis();//获取系统当前时间
        while ((d=fis.read(date))!=-1){//判断有文件输出
            fos.write(date,0,d);//输出文件
        }
         long end=System.currentTimeMillis();
        System.out.println("复制完毕,用时:"+(end-start)+"ms");
        fis.close();
        fos.close();
    }
}
        /*
            java.io.InputStream上定义了块读操作

            int read(byte[] data)
            一次性从流中读取给定字节数组data总长度的字节量并装入到该数组中.返回值是一个整数表达
            实际读取到的字节数,如果返回值为整数-1则表示流读取到了末尾


            例如:
            image.png文件数据:
            11110000 10101010 01010101 00001111 11000011 00111100 01100110 11001101

            int d;
            byte[] data = new byte[3];//数组可以存3个字节

            data:{00000000,00000000,00000000}


            第一次调用:
            d = fis.read(data);//一次性读取3个字节并存入到data数组中
            image.png文件数据:
            11110000 10101010 01010101 00001111 11000011 00111100 01100110 11001101
            ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
                   读取到的三个字节

            data:{11110000,10101010,01010101}
            d:3  整数3表示实际读取到了3个字节

           --------------------------------------------------------------------------


            第二次调用:
            d = fis.read(data);//一次性读取3个字节并存入到data数组中
            image.png文件数据:
            11110000 10101010 01010101 00001111 11000011 00111100 01100110 11001101
                                       ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
                                              读取到的三个字节

            data:{00001111,11000011,00111100}
            d:3  整数3表示实际读取到了3个字节


           --------------------------------------------------------------------------


            第三次调用:
            d = fis.read(data);//一次性读取3个字节并存入到data数组中
            image.png文件数据:
            11110000 10101010 01010101 00001111 11000011 00111100 01100110 11001101 文件末尾
                                                                  ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
                                                                   实际读取2个字节

            data:{01100110, 11001101, 00111100}
                 |本次实际读取到的数据|  |-旧数据-|
            d:2  整数2表示实际读取到了2个字节



             --------------------------------------------------------------------------

            第四次调用:
            d = fis.read(data);
            image.png文件数据:
            11110000 10101010 01010101 00001111 11000011 00111100 01100110 11001101 文件末尾

            data:{01100110, 11001101, 00111100}
                 |----------本旧数据----------|
            d:-1  已经是文件末尾了

            java.io.OutputStream字节输出流超类上定义了块写操作

            void write(byte[] data)
            一次性将给定字节数组data中所有字节写出

         */

/*
            00000000   8位2进制   1byte  1字节
            1024byte   1kb
            1024kb     1mb   1M(兆)
            1024mb     1GB
            1024GB     1TB
            1024TB     1PB
         */